/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include <面/面.h>
#include <MBT_Engine.h>

class C_节点树;


typedef enum : uint32 {
	e_模型编辑_无,
	e_模型编辑_网格,
	e_模型编辑_选择,
}E_模型编辑模型;

enum E_骨骼编辑模式 : uint32 {
	e_物体模式,
	e_骨节编辑模式,
	e_骨头编辑模式,
	e_姿态模式,
};

enum E_骨骼姿态编辑模式 : uint32 {
	e_旋转模式,
	e_拖拽模式,
};


struct S_射线拾取参数 {
	static vec3 g相机位置;
	static vec3 g开始射线;
	static vec3 g结束射线;
	static vec3 g手柄位置;
	static vec3 g垂足坐标;
	static vec3 g垂直线向量;
	static vec3 g交点S;
	static vec3 g交点E;
	static float32 g垂直线长度;
	static float32 g开始交点距离;
	static float32 g结束交点距离;
};



struct S_节点数据状态 {
	static S_Props	g_打开编辑模式;

	static S_Props g_网格编辑模式;
	static S_Props g_骨骼编辑模式;
	static S_Props g_灯光编辑模式;

	static S_Props	g_3D视口显示模式;
};



struct S_节点数据 {
	static uint64 g_文件版本号;

	static uint64 g_低版本号_0;
	static uint64 g_低版本号_1;
	static uint64 g_低版本号_2;
	static uint64 g_低版本号_3;
	static uint64 g_低版本号_4;
	static uint64 g_低版本号_5;
	static uint64 g_低版本号_6;
	static uint64 g_低版本号_7;

	//static S_Props		m_节点树容器;
	static std::vector<std::vector<S_MapPtrItem>*> g_节点树容器;

	static std::vector<S_MapPtrItem> g_包节点树;
	static std::vector<S_MapPtrItem> g_物体节点树;
	static std::vector<S_MapPtrItem> g_几何节点树;
	static std::vector<S_MapPtrItem> g_渲染节点树;
	static std::vector<S_MapPtrItem> g_函数节点树;
	static std::vector<S_MapPtrItem> g_材质节点树;
	static std::vector<S_MapPtrItem> g_着色节点树;

	

	static std::vector<C_节点树*>	g_根节点树;
	static std::vector<C_节点树*>	g_渲染根节点树;
	static std::map<std::wstring, E_值类型>	g_值类型名称映射;
	static std::map<std::wstring, C_节点树*> G用于重新映射节点树到节点的容器;

	
	static C_StrKey分配器		g_节点树名称分配器;
	static C_Key分配器			g_着色器ID分配器;

	static C_Key分配器			G_平行光ID;
	static C_Key分配器			G_点光源ID;
	static C_Key分配器			G_区域光ID;
	static C_Key分配器			G_聚光灯ID;

	static S_摄像机*			g_当前操作视口相机;
	static S_Props				g_物理引擎视口互交;
	static vec3					g_视口鼠标点射线[2];
	static S_物理互交参数		g_视口物理互交参数;

	
	static std::string          g_工程文件路径;
	static std::string			g_工程文件名称;
	
	static std::string			g_工程文件节点代码路径;
	static std::string			g_工程文件几何节点代码绝对路径;
	static std::string			g_工程文件函数节点代码绝对路径;
	static std::string			g_工程文件材质节点代码绝对路径;
	static std::string			g_工程文件着色节点代码绝对路径;
	static std::string			g_编译器路径;


	static C_节点树* G当前包节点树;
	static C_节点树* G当前物体节点树;
	static C_节点树* G当前材质节点树;
	static C_节点树* G当前着色节点树;
	static C_节点树* G当前渲染节点树;
	static bool g_开启节点帧更新;



	static std::vector<S_物体*> g_选中激活物体;
	static std::set<S_物体*> m_全局物体set;
	static std::set<S_物体*> m_独立物体set;
	static S_物体* m_包围盒物体;

	static C_StrKey分配器		           g_物体名称分配器;
	static std::map<std::wstring, S_物体*> g_全局索引物体;


	
	static int32 g_渲染帧编号;

	
};




enum E_节点工程文件块类型 : uint64 {
	e_工程文件块_属性变量b = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'b', '\0', '\0'),


	e_工程文件块_属性变量u8 = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'u', '8', '\0'),
	e_工程文件块_属性变量u16 = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'u', '1', '6'),
	e_工程文件块_属性变量u32 = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'u', '3', '2'),
	e_工程文件块_属性变量u64 = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'u', '6', '4'),


	e_工程文件块_数组I8 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'i', '8', '\0'),
	e_工程文件块_数组I16 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'i', '1', '6'),
	e_工程文件块_数组I32 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'i', '3', '2'),
	e_工程文件块_数组I64 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'i', '6', '4'),

	e_工程文件块_数组F16 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'f', '1', '6'),
	e_工程文件块_数组F32 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'f', '3', '2'),
	e_工程文件块_数组F64 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'f', '6', '4'),

	e_工程文件块_vec2 = DEF_字符串拼接ID('v', 'e', 'c', '2', '\0', '\0', '\0', '\0'),
	e_工程文件块_vec3 = DEF_字符串拼接ID('v', 'e', 'c', '3', '\0', '\0', '\0', '\0'),
	e_工程文件块_vec4 = DEF_字符串拼接ID('v', 'e', 'c', '4', '\0', '\0', '\0', '\0'),

	e_工程文件块_数组vec2 = DEF_字符串拼接ID('v', 'e', 'c', '2', 's', 'z', '\0', '\0'),
	e_工程文件块_数组vec3 = DEF_字符串拼接ID('v', 'e', 'c', '3', 's', 'z', '\0', '\0'),
	e_工程文件块_数组vec4 = DEF_字符串拼接ID('v', 'e', 'c', '4', 's', 'z', '\0', '\0'),

	e_工程文件块_节点树 = DEF_字符串拼接ID('N', 'o', 'd', 'e', 'T', 'r', 'e', 'e'),
	e_工程文件块_节点树属性 = DEF_字符串拼接ID('N', 'T', 'P', 'r', 'o', 'p', '\0', '\0'),
	e_工程文件块_物体节点树 = DEF_字符串拼接ID('N', 'T', 'O', 'b', '\0', '\0', '\0', '\0'),
	e_工程文件块_渲染节点树 = DEF_字符串拼接ID('N', 'T', 'R', 'e', 'n', 'd', 'e', 'r'),
	e_工程文件块_节点 = DEF_字符串拼接ID('N', 'o', 'd', 'e', '\0', '\0', '\0', '\0'),
	e_工程文件块_节点实例属性 = DEF_字符串拼接ID('N', 'o', 'd', 'e', 'P', 'r', 'o', 'p'),
	e_工程文件块_插座实例属性 = DEF_字符串拼接ID('C', 'Z', 'S', 'L', '\0', '\0', '\0', '\0'),
	e_工程文件块_节点子集树 = DEF_字符串拼接ID('S', 'u', 'b', 's', 'e', 't', 'N', 'T'),
	e_工程文件块_库节点 = DEF_字符串拼接ID('N', 'o', 'd', 'e', 'L', 'i', 'b', '\0'),

	e_工程文件块_网格缓存 = DEF_字符串拼接ID('M', 'e', 'C', 'a', 'c', 'h', 'e', '\0'),

	e_工程文件块_2D视口工作区状态 = DEF_字符串拼接ID('2', 'd', 'G', 'Z', 'Q', 'Z', 'T', '\0'),

	e_工程文件块_结束 = DEF_字符串拼接ID('E', 'n', 'd', '\0', '\0', '\0', '\0', '\0'),
};



struct S_骨骼插座数据 {
	S_物体* m_骨架;
	S_物体* m_骨节;

	std::vector<S_骨骼插座数据*> m_子骨骼;
};




std::string f_nodeCtx_相对路径补全(const std::string path);



